﻿using System;
using System.Collections.Generic;
using personalplaner.business.common;
using personalplaner.business.dienstplan.plancollection;
using personalplaner.business.enums;
using personalplaner.business.stamm;
using personalplaner.common;
using personalplaner.dataprovider;

namespace personalplaner.servicemodel.dataaccess
{
	#region Interface

	public interface IDiensteDataAccess
	{
		#region Get Methods

		/// <summary>
		/// Creates a List with the Dienstschema of a abteilung, [dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]
		/// </summary>
		/// <param name="schemaid">schemaid</param>
		/// <param name="abteilungid">abteilungid</param>
		/// <returns>[dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]</returns>
		IEnumerable<Dienst> GetDiensteInSchema(int schemaid, int abteilungid);

		/// <summary>
		/// Gets a list of Dienst that are not contained int the schema 
		/// [dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]
		/// </summary>
		/// <param name="schemaid">schemaid</param>
		/// <param name="abteilungid">abteilungid</param>
		/// <returns>[dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]</returns>
		IEnumerable<Dienst> GetDienstNotInSchema(int schemaid, int abteilungid);

		/// <summary>
		/// Gets a list of all dienste [DienstID,Name,Gerechnet,Typ,RGB,GanzerTag,Kurztext,Langtext]
		/// </summary>
		/// <param name="all">false = only active</param>
		/// <param name="addEmptyRow">add empty row at top</param>
		/// <returns>[DienstID,Name,Gerechnet,Typ,RGB,GanzerTag,Kurztext,Langtext]</returns>
		IEnumerable<Dienst> GetDienste(bool all, bool addEmptyRow);

		/// <summary>
		/// Gets a list of diensttypen [wert,textwert]
		/// </summary>
		/// <returns>[wert,textwert]</returns>
		IEnumerable<OptionValue> GetDienstTyp();

        /// <summary>
        /// [dienstzeitid,dienstid,von,bis,typ,datumvon,datumbis,abteilungszeit]
        /// </summary>
        /// <param name="dienstid">dienstid</param>
        /// <returns>[dienstzeitid,dienstid,von,bis,typ]</returns>
        IEnumerable<DienstZeitCollection> GetDienstZeiten(int dienstid);

		/// <summary>
		/// Creates a list with the Dienstschema of all abteilungen
		///		- public static DataView GetDienstSchema(int schemaid, string mandid)
		/// </summary>
		/// <param name="schemaid">schemaid</param>
		/// <returns>[dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]</returns>
		IEnumerable<DienstOverviewRow> GetPlanDienstOverview(int schemaid);

		/// <summary>
		/// Creates a list with the Dienstschema of a abteilung
		///		- public static DataView GetDienstSchema(int schemaid, int abteilungid, string mandid)
		/// </summary>
		/// <param name="schemaid">schemaid</param>
		/// <param name="abteilungid">abteilungid</param>
		/// <returns>[dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]</returns>
		IEnumerable<DienstOverviewRow> GetPlanDienstOverview(int schemaid, int abteilungid);

		#endregion

		#region Set Methods

		bool SaveDiensteToSchema(IEnumerable<Dienst> dienste, int schemaid, int abteilungid);

		int SaveDienst(Dienst dienst);

		bool SetDienstZeit(DienstZeit dienstzeit);

		#endregion

		#region Update Methods

		bool UpdateDienst(Dienst dienst);

		bool DeleteDienst(int dienstid);

		bool EndDienstZeiten(int dienstid, DateTime enddate);

		#endregion

		#region Delete Methods

		bool DeleteDienstZeit(int dienstid, DienstZeitCollection dienstzeit);

		#endregion
	}

	#endregion

	public class DiensteDataAccess : BaseDataAccess, IDiensteDataAccess
	{
		public DiensteDataAccess(ISettingsProvider settings)
			: base(settings)
		{
		}

		#region Get Methods

		/// <summary>
		/// Creates a List with the Dienstschema of a abteilung, [dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]
		/// </summary>
		/// <param name="schemaid">schemaid</param>
		/// <param name="abteilungid">abteilungid</param>
		/// <returns>[dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]</returns>
		public IEnumerable<Dienst> GetDiensteInSchema(int schemaid, int abteilungid)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.GetDiensteInSchema(Settings.DatabaseSettings, schemaid, abteilungid);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return null;
			}
		}

		/// <summary>
		/// Gets a list of Dienst that are not contained int the schema 
		/// [dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]
		/// </summary>
		/// <param name="schemaid">schemaid</param>
		/// <param name="abteilungid">abteilungid</param>
		/// <returns>[dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]</returns>
		public IEnumerable<Dienst> GetDienstNotInSchema(int schemaid, int abteilungid)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.GetDienstNotInSchema(Settings.DatabaseSettings, schemaid, abteilungid);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return null;
			}
		}

		/// <summary>
		/// Gets a list of all dienste [DienstID,Name,Gerechnet,Typ,RGB,GanzerTag,Kurztext,Langtext]
		/// </summary>
		/// <param name="all">false = only active</param>
		/// <param name="addEmptyRow">add empty row at top</param>
		/// <returns>[DienstID,Name,Gerechnet,Typ,RGB,GanzerTag,Kurztext,Langtext]</returns>
		public IEnumerable<Dienst> GetDienste(bool all, bool addEmptyRow)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.GetDienste(Settings.DatabaseSettings, all, addEmptyRow);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return null;
			}
		}


		/// <summary>
		/// Gets a list of diensttypen [wert,textwert]
		/// </summary>
		/// <returns>[wert,textwert]</returns>
		public IEnumerable<OptionValue> GetDienstTyp()
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.CommonService.GetOptions(Settings.DatabaseSettings, enOptionType.Diensttyp);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return null;
			}
		}

        /// <summary>
        /// [dienstzeitid,dienstid,von,bis,typ,datumvon,datumbis,abteilungszeit]
        /// </summary>
        /// <param name="dienstid">dienstid</param>
        /// <returns>[dienstzeitid,dienstid,von,bis,typ]</returns>
        public IEnumerable<DienstZeitCollection> GetDienstZeiten(int dienstid)
        {
            using (new WaitCursor())
            {
                try
                {
                    return DataServices.DiensteService.GetDienstZeiten(Settings.DatabaseSettings, dienstid);
                }
                catch (Exception e)
                {
                    //TODO: show a messagebox here with the error
                    Console.Write(e);
                }

                return null;
            }
        }

		/// <summary>
		/// Creates a list with the Dienstschema of all abteilungen, [dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]
		///		- public static DataView GetDienstSchema(int schemaid, string mandid)
		/// </summary>
		/// <param name="schemaid">schemaid</param>
		/// <returns>[dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]</returns>
		public IEnumerable<DienstOverviewRow> GetPlanDienstOverview(int schemaid)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.GetPlanDienstOverview(Settings.DatabaseSettings, schemaid);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return null;
			}
		}

		/// <summary>
		/// Creates a list with the Dienstschema of a abteilung, [dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]
		///		- public static DataView GetDienstSchema(int schemaid, int abteilungid, string mandid)
		/// </summary>
		/// <param name="schemaid">schemaid</param>
		/// <param name="abteilungid">abteilungid</param>
		/// <returns>[dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]</returns>
		public IEnumerable<DienstOverviewRow> GetPlanDienstOverview(int schemaid, int abteilungid)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.GetPlanDienstOverview(Settings.DatabaseSettings, schemaid, abteilungid);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return null;
			}
		}

		#endregion

		#region Set Methods

		public bool SaveDiensteToSchema(IEnumerable<Dienst> dienste, int schemaid, int abteilungid)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.SaveDiensteToSchema(Settings.DatabaseSettings, dienste, schemaid, abteilungid);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return false;
			}
		}

		public int SaveDienst(Dienst dienst)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.SaveDienst(Settings.DatabaseSettings, dienst, Settings.Mandant);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return 0;
			}
		}

		public bool SetDienstZeit(DienstZeit dienstzeit)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.SetDienstZeit(Settings.DatabaseSettings, dienstzeit);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return false;
			}
		}

		#endregion

		#region Update Methods

		public bool UpdateDienst(Dienst dienst)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.UpdateDienst(Settings.DatabaseSettings, dienst);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return false;
			}
		}

		public bool DeleteDienst(int dienstid)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.DeleteDienst(Settings.DatabaseSettings, dienstid);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return false;
			}
		}

		public bool EndDienstZeiten(int dienstid, DateTime enddate)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.EndDienstZeiten(Settings.DatabaseSettings, dienstid, enddate);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return false;
			}
		}

		#endregion

		#region Delete Methods

		public bool DeleteDienstZeit(int dienstid, DienstZeitCollection dienstzeit)
		{
			using (new WaitCursor())
			{
				try
				{
					return DataServices.DiensteService.DeleteDienstZeit(Settings.DatabaseSettings, dienstid, dienstzeit);
				}
				catch (Exception e)
				{
					//TODO: show a messagebox here with the error
					Console.Write(e);
				}

				return false;
			}
		}

		#endregion
	}
}
